package com.sky.skyopsserver.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.sky.skyopsserver.domain.Project;
import com.sky.skyopsserver.vos.*;

import java.util.List;

/**
 * 项目信息服务接口
 * 
 * @author Administrator
 * @description 针对表【project(项目信息表)】的数据库操作Service
 * @createDate 2025-09-13 17:43:03
 */
public interface ProjectService extends IService<Project> {

    /**
     * 添加项目
     * 
     * @param reqVO 添加项目请求VO
     * @return 项目ID
     */
    Long addProject(ProjectAddReqVO reqVO);

    /**
     * 更新项目信息
     * 
     * @param reqVO 更新项目请求VO
     * @return 是否更新成功
     */
    Boolean updateProject(ProjectUpdateReqVO reqVO);

    /**
     * 根据ID删除项目
     * 
     * @param id 项目ID
     * @return 是否删除成功
     */
    Boolean deleteProject(Long id);

    /**
     * 批量删除项目
     * 
     * @param ids 项目ID列表
     * @return 是否删除成功
     */
    Boolean batchDeleteProject(List<Long> ids);

    /**
     * 根据ID查询项目详情
     * 
     * @param id 项目ID
     * @return 项目详情
     */
    ProjectRspVO getProjectById(Long id);

    /**
     * 根据ID查询项目详情（包含应用列表）
     * 
     * @param id 项目ID
     * @return 项目详情（包含应用列表）
     */
    ProjectDetailRspVO getProjectDetailById(Long id);

    /**
     * 分页查询项目列表
     * 
     * @param reqVO 分页查询请求VO
     * @return 分页结果
     */
    IPage<ProjectRspVO> getProjectPage(ProjectPageReqVO reqVO);

    /**
     * 查询所有项目选项（用于下拉选择）
     * 
     * @return 项目选项列表
     */
    List<ProjectOptionRspVO> getAllProjectOptions();

    /**
     * 查询有应用的项目选项
     * 
     * @return 项目选项列表
     */
    List<ProjectOptionRspVO> getProjectOptionsWithApps();

    /**
     * 查询空项目选项
     * 
     * @return 项目选项列表
     */
    List<ProjectOptionRspVO> getEmptyProjectOptions();

    /**
     * 获取项目统计信息
     * 
     * @return 项目统计信息
     */
    ProjectStatisticsRspVO getProjectStatistics();

    /**
     * 检查项目编码是否已存在
     * 
     * @param code 项目编码
     * @param excludeId 排除的项目ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkProjectCodeExists(String code, Long excludeId);

    /**
     * 检查项目名称是否已存在
     * 
     * @param name 项目名称
     * @param excludeId 排除的项目ID（用于更新时检查）
     * @return 是否存在
     */
    Boolean checkProjectNameExists(String name, Long excludeId);

    /**
     * 根据编码查询项目
     * 
     * @param code 项目编码
     * @return 项目信息
     */
    ProjectRspVO getProjectByCode(String code);

    /**
     * 根据名称模糊查询项目
     * 
     * @param name 项目名称关键字
     * @return 项目列表
     */
    List<ProjectRspVO> searchProjectByName(String name);

    /**
     * 根据编码模糊查询项目
     * 
     * @param code 项目编码关键字
     * @return 项目列表
     */
    List<ProjectRspVO> searchProjectByCode(String code);

    /**
     * 获取项目下的应用数量
     * 
     * @param projectId 项目ID
     * @return 应用数量
     */
    Long getApplicationCountByProjectId(Long projectId);

    /**
     * 批量获取项目下的应用数量
     * 
     * @param projectIds 项目ID列表
     * @return 项目ID与应用数量的映射
     */
    java.util.Map<Long, Long> getApplicationCountByProjectIds(List<Long> projectIds);

    /**
     * 验证项目编码格式
     * 
     * @param code 项目编码
     * @return 是否有效
     */
    Boolean validateProjectCode(String code);

    /**
     * 获取所有项目编码列表
     * 
     * @return 项目编码列表
     */
    List<String> getAllProjectCodes();

    /**
     * 获取所有项目名称列表
     * 
     * @return 项目名称列表
     */
    List<String> getAllProjectNames();

    /**
     * 移动应用到指定项目
     * 
     * @param applicationIds 应用ID列表
     * @param targetProjectId 目标项目ID
     * @return 是否移动成功
     */
    Boolean moveApplicationsToProject(List<Long> applicationIds, Long targetProjectId);

    /**
     * 从项目中移除应用
     * 
     * @param applicationIds 应用ID列表
     * @param projectId 项目ID
     * @return 是否移除成功
     */
    Boolean removeApplicationsFromProject(List<Long> applicationIds, Long projectId);
}
